package com.aizuda.boot.modules.flw.mapper;

import com.aizuda.boot.modules.flw.entity.dto.FlwProcessInstanceDTO;
import com.aizuda.boot.modules.flw.entity.dto.ProcessTaskDTO;
import com.aizuda.boot.modules.flw.entity.vo.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface FlowlongMapper {

    List<FlwProcessVO> selectFlwProcessList();

    List<FlwProcessVO> selectLaunchProcessList();

    /**
     * 待认领任务分页列表
     */
    Page<PendingClaimTaskVO> selectPagePendingClaim(Page<PendingClaimTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 待审批任务分页列表
     */
    Page<PendingApprovalTaskVO> selectPagePendingApproval(Page<PendingApprovalTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 所有待审批任务分页列表
     */
    Page<PendingApprovalTaskVO> selectPageAllPendingApproval(Page<PendingApprovalTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 我的申请任务分页列表
     */
    Page<ProcessTaskVO> selectPageMyApplication(Page<ProcessTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 我收到的任务分页列表
     */
    Page<ProcessTaskVO> selectPageMyReceived(Page<ProcessTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 已审批任务分页列表
     */
    Page<ProcessTaskVO> selectPageApproved(Page<ProcessTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 所有已审批任务分页列表
     */
    Page<PendingApprovalTaskVO> selectPageAllApproved(Page<PendingApprovalTaskVO> page, @Param("dto") ProcessTaskDTO dto);

    /**
     * 查询流程实例ID的审批历史
     */
    List<FlwHisTaskVO> selectListHisTaskByInstanceId(@Param("instanceId") Long instanceId);

    /**
     * 查询流程实例ID的审批处理人
     */
    List<FlwHisTaskActorVO> selectListHisTaskActorVOByInstanceId(@Param("instanceId") Long instanceId);

    /**
     * 待办数量
     */
    Integer selectCountPendingApproval(@Param("actorId") String actorId);

    /**
     * 不存在角色权限的流程ID列表
     */
    List<Long> selectNotExistProcessIds(@Param("userId") Long userId);

    /**
     * 流程实例分页列表
     */
    Page<FlwInstanceVO> selectPageInstance(Page<FlwInstanceVO> page, @Param("dto") FlwProcessInstanceDTO dto);

    /**
     * 业务流程列表
     * @return
     */
    List<FlwProcessVO> selectBussinessFlwProcessList(@Param("type") String type);

    /**
     * 子流程列表
     * @return
     */
    List<FlwProcessVO> selectChildFlwProcessList();

    /**
     * 查询父节点参与者是否存在
     */
    Integer selectCountByParentTaskIdAndActorId(@Param("parentTaskId") Long parentTaskId, @Param("actorId") String actorId);

    /**
     * 检查用户是否参与了指定流程实例的历史任务
     */
    Integer selectCountUserParticipatedInInstance(@Param("instanceId") Long instanceId, @Param("userId") Long userId);

    /**
     * 查询用户的待办任务实例ID列表
     */
    List<Long> selectPendingTaskInstanceIds(@Param("userId") Long userId);

    /**
     * 查询用户的待办任务实例ID和任务创建时间的映射
     */
    List<Map<String, Object>> selectPendingTaskInstanceWithCreateTime(@Param("userId") Long userId);

    /**
     * 根据实例ID列表查询任务创建时间
     */
    List<Map<String, Object>> selectTaskCreateTimeByInstanceIds(@Param("instanceIds") List<Long> instanceIds);
}
